/*
 * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard.All Rights Reserved.
 *
 * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
 * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
 *
 * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
 * WARRANTIES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
 * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
 * OR NOT DISCOVERABLE.  IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
 * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
 * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
 * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
 * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
 * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
 */

package org.broad.tribble.source;

import org.apache.log4j.Logger;
import org.broad.tribble.Feature;

import java.io.File;
import java.io.IOException;

/**
 * The basic feature iterator for indexed files
 *
 * @author Jacob Silterra
 */
public class IndexedIterator<T extends Feature> extends FeatureIterator<T> {

    private static Logger log = Logger.getLogger(IndexedIterator.class);

    protected String chr;
    protected int start;
    protected int end;

    public IndexedIterator(BasicFeatureSource<T> basicFeatureSource,
                           String sequence,
                           int start,
                           int end) throws IOException {

        this.codec = basicFeatureSource.codec;
        this.inputFile = basicFeatureSource.path;
        this.chr = sequence;
        this.start = start;
        this.end = end;
        this.reader = basicFeatureSource.querySource.query(chr, start, end);
        this.init();
    }

    /**
     * read the next record, storing it in the currentRecord variable
     *
     * @throws java.io.IOException
     */
    protected void readNextRecord() throws IOException {
        do {
            super.readNextRecord();
        }
        while (currentRecord != null && !checkWithinBounds(this.currentRecord));
    }

    public boolean hasNext() {
        if (currentRecord == null) {
            return false;
        } else {
            return checkWithinBounds(currentRecord) && (currentRecord.getStart() <= end);
        }
    }

    /**
     * Check that feature is within the provided bounds.
     *
     * @return
     */
    private boolean checkWithinBounds(Feature feature) {
        return feature.getChr().equals(chr) && feature.getEnd() >= start;
    }
}
